package org.cybzacg.convert.strategy.impl;


import lombok.extern.slf4j.Slf4j;
import org.cybzacg.convert.context.ConversionContext;
import org.cybzacg.convert.core.TypeConverter;
import org.cybzacg.convert.enums.ConversionStrategyEnum;
import org.cybzacg.convert.exception.ConversionException;
import org.cybzacg.convert.strategy.ConversionStrategy;

/**
 * 宽松转换策略
 * 在转换失败时返回默认值，不抛出异常
 *
 * @author cybzacg.blog
 * @version 3.0
 * @since 3.0
 */
@Slf4j
public class LenientConversionStrategy implements ConversionStrategy {

    @Override
    public <T> T execute(
            TypeConverter converter,
            Object source,
            Class<T> targetType,
            T defaultValue,
            ConversionContext context
    ) throws ConversionException {

        try {
            // 尝试执行转换
            T result = converter.convert(source, targetType, defaultValue, context);

            // 如果结果为null且提供了默认值，返回默认值
            if (result == null && defaultValue != null) {
                log.debug("转换结果为null，使用默认值: {}", defaultValue);
                return defaultValue;
            }

            return result;

        } catch (Exception e) {
            log.warn("宽松模式下转换失败，使用默认值: {} -> {}, 错误: {}",
                    source, targetType.getSimpleName(), e.getMessage());

            // 宽松模式下返回默认值，不抛出异常
            return defaultValue;
        }
    }

    @Override
    public ConversionStrategyEnum getName() {
        return ConversionStrategyEnum.LENIENT;
    }

    @Override
    public String getDescription() {
        return "宽松转换策略，转换失败时使用默认值，不抛出异常";
    }

    @Override
    public boolean supports(ConversionContext context) {
        return context != null && context.getStrategy().isLenient();
    }
}
